DirList Subroutine

public subroutine DirList(dir, list, nfiles, filext)

return a list of files in a directory

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: dir
character(len=*), intent(out) :: list
integer(kind=short), intent(out) :: nfiles
character(len=*), intent(in), optional :: filext

Variables

Type Visibility Attributes Name Initial
character(len=1000), public :: cmd
integer(kind=short), public :: i
integer(kind=short), public :: ios
character(len=300), public :: string
integer(kind=short), public :: unit

Source Code

SUBROUTINE DirList &
!
(dir, list, nfiles, filext)

IMPLICIT NONE

!Arguments with intent(in):
CHARACTER (LEN = *), INTENT(IN) :: dir 

!Optional arguments with intent(in):
CHARACTER (LEN = *), OPTIONAL, INTENT(IN) :: filext 

!Arguments with intent (out):
CHARACTER (LEN = *), INTENT(OUT) :: list
INTEGER (KIND = short), INTENT (OUT) :: nfiles


! Local declarations:  
CHARACTER (LEN = 1000)      :: cmd
INTEGER (KIND = short)      :: unit, i, ios
CHARACTER (LEN  = 300)      :: string
!------------end of declaration------------------------------------------------

IF (PRESENT (filext)) THEN !filter files for file extension
    IF (GetOS () == WIN32) THEN !detected Windows OS
       cmd = 'dir ' // TRIM(dir) // '*.' // TRIM(filext) // ' /b/a:-d > ' &
                    // TRIM (dir) // 'list.txt'
       CALL System (cmd)
    ELSE !detected unix like OS, including linux
      !cmd = 'ls *.' // TRIM(filext) // ' '  // TRIM(dir) // ' > ' // TRIM (dir) // 'list.txt'
      cmd = 'find ' // TRIM(dir) // ' -name "*.' // TRIM(filext) // &
            '" -printf "%f\n" > ' // TRIM (dir) // 'list.txt'
      CALL System (cmd)
    END IF
ELSE
    
    IF (GetOS () == WIN32) THEN !detected Windows OS
       cmd = 'dir ' // TRIM(dir) // ' /b/a:-d > ' // TRIM (dir) // 'list.txt'
       CALL System (cmd)
    ELSE !detected unix like OS, including linux
      cmd = 'ls *.?*' // dir // ' > ' // TRIM (dir) // 'list.txt'
      cmd = 'find ' // TRIM(dir) // ' -name "*.?*' // '" -printf "%f\n" > ' &
                    // TRIM (dir) // 'list.txt'
      CALL System (cmd)
    END IF
END IF

unit = GetUnit ()
OPEN (unit = unit, file = TRIM (dir) // 'list.txt')


list = ''
nfiles = 0
DO
   READ(unit,*,IOSTAT = ios) string
   IF (ios < 0)  THEN !end of file reached
       EXIT
   ELSE 
       nfiles = nfiles + 1
       IF (nfiles == 1) THEN
          list(1:) =  TRIM (string)
       ELSE
          list(LEN_TRIM (list)+1:) =  ',' // TRIM (string)
       END IF
   END IF
END DO


CLOSE (unit)


END SUBROUTINE DirList